package com.qf.config;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 *
 * @AfterReturning: 后置增强， 如果有异常，则不执行
 * @After: 最终增强，无论是否有异常，都执行
 * @author 千锋教育
 * @Company http://www.mobiletrain.org/
 * @Version 1.0
 */
@Aspect
@Component
public class AopConfig {


    //切入点表达式
    @Pointcut("execution(* com.qf.service.impl.*.*(..))")
    public void pc(){}

//    //增强
//    @Before("pc()")
//    public void before(){
//        System.out.println("在方法执行之前执行");
//    }
//
//    @After("pc()")
//    public void after(){
//        System.out.println("在方法执行之后执行 01");
//    }
//
//    @AfterReturning("pc()")
//    public void afterReturning(){
//        System.out.println("在方法执行之后执行 02");
//    }
//
//
//    @AfterThrowing("pc()")
//    public void afterThrowing(){
//        System.out.println("在出现异常后执行");
//    }


    //环绕增强: 调用原始方法(如果没有调用原始方法，原始方法内容则不执行)
    //ProceedingJoinPoint 连接点对象（被拦截的方法）
    @Around("pc()")
    public Object around(ProceedingJoinPoint joinPoint){
        try {
            System.out.println("前置");
            Object result = joinPoint.proceed();
            System.out.println("后置");
            return result;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("异常");
        } finally {
            System.out.println("最终");
        }
        return null;
    }
}
